package com.timo.rabbitmq.config;

import com.timo.constant.RabbitMqConstant.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Description: Fanout queue 和交换器的定义
 *
 * 因为要测试多个交换器的案例，为了防止队列名称重复的情况出现，这里就统一名命规范
 *  队列的结尾必是“FanoutQueue”：helloFanoutQueue
 *  交换器的结尾必须是“FanoutExchange”：helloFanoutExchange
 *  队列和交换器的绑定 （队列Bingding交换器：queueBindingExchange） 的名命格式1：helloFanoutQueueBindingHelloFanoutExchange
 *  队列和交换器的绑定 如果队列名称的前缀和交换器的前缀相同的情况下可以使用缩写  的名命格式2：helloFanoutBinding
 * @Author: Timo
 * @Date: 2019/7/25 10:15
 */
@Slf4j
@Configuration
public class FanoutRabbitMqConfig {
    /**
     * ##################################################
     * #    queue 的定义
     * #################################################
     */

    @Bean
    Queue helloFanoutQueue() {
        return new Queue("hello-2-queue");
    }


    @Bean
    Queue timoPubSubFanoutQueue() {
        return new AnonymousQueue();
    }


    /**
     * ##################################################
     * #    Exchange 的定义
     * #################################################
     */

    @Bean
    FanoutExchange helloFanoutExchange() {
        return new FanoutExchange(FanoutExchangeEnum.HELLO_FANOUT_EXCHANGE.name);
    }


    @Bean
    FanoutExchange timoPubSubFanoutExchange() {
        return new FanoutExchange(FanoutExchangeEnum.TIMO_PUB_SUB_FANOUT_EXCHANGE.name);
    }


    /**
     * ##################################################
     * #    Binding 将队列绑定要交换器上
     * #################################################
     */

    @Bean
    Binding helloFanoutBinding() {
        return BindingBuilder.bind(helloFanoutQueue()).to(helloFanoutExchange());
    }


    @Bean
    Binding timoPubSubFanoutBinding() {
        return BindingBuilder.bind(timoPubSubFanoutQueue()).to(timoPubSubFanoutExchange());
    }
}
